#ifndef METERMODEL_H
#define METERMODEL_H

#include <QAbstractListModel>
#include <QVector>
#include <QTimer>
#include <QSet>
#include "../core/meter.h"
#include "../core/devicemanager.h"

/**
 * @brief 电表数据模型类
 * 用于在QML中显示电表列表
 * 支持过滤、排序等功能
 */
class MeterModel : public QAbstractListModel
{
    Q_OBJECT
    Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
    Q_PROPERTY(FilterMode filterMode READ filterMode WRITE setFilterMode NOTIFY filterModeChanged)
    Q_PROPERTY(int filterBusId READ filterBusId WRITE setFilterBusId NOTIFY filterBusIdChanged)

public:
    /**
     * @brief 数据角色枚举
     */
    enum MeterRoles
    {
        MeterIdRole = Qt::UserRole + 1, ///< 电表ID
        NameRole,                       ///< 电表名称
        LocationRole,                   ///< 电表位置
        BusIdRole,                      ///< 总线ID
        OnlineRole,                     ///< 在线状态
        UaRole,                         ///< A相电压
        UbRole,                         ///< B相电压
        UcRole,                         ///< C相电压
        IaRole,                         ///< A相电流
        IbRole,                         ///< B相电流
        IcRole,                         ///< C相电流
        AverageVoltageRole,             ///< 平均电压
        AverageCurrentRole,             ///< 平均电流
        TotalPowerRole,                 ///< 总功率
        LastUpdateTimeRole,             ///< 最后更新时间
        FailureCountRole,               ///< 失败次数
        MeterObjectRole                 ///< Meter对象指针（用于直接访问）
    };
    Q_ENUM(MeterRoles)

    /**
     * @brief 过滤模式枚举
     */
    enum FilterMode
    {
        ShowAll = 0, ///< 显示全部
        ShowOnline,  ///< 仅显示在线
        ShowOffline, ///< 仅显示离线
        ShowByBus    ///< 按总线过滤
    };
    Q_ENUM(FilterMode)

    explicit MeterModel(DeviceManager *deviceManager, QObject *parent = nullptr);
    ~MeterModel();

    // QAbstractListModel 接口实现
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    QHash<int, QByteArray> roleNames() const override;

    /**
     * @brief 获取过滤模式
     */
    FilterMode filterMode() const { return m_filterMode; }

    /**
     * @brief 设置过滤模式
     */
    void setFilterMode(FilterMode mode);

    /**
     * @brief 获取过滤总线ID
     */
    int filterBusId() const { return m_filterBusId; }

    /**
     * @brief 设置过滤总线ID
     */
    void setFilterBusId(int busId);

    /**
     * @brief 刷新模型数据
     */
    Q_INVOKABLE void refresh();

    /**
     * @brief 根据索引获取电表对象
     * @param index 索引
     * @return 电表对象指针
     */
    Q_INVOKABLE Meter *getMeterAt(int index) const;

    /**
     * @brief 根据电表ID查找索引
     * @param meterId 电表ID
     * @return 索引，如果不存在返回-1
     */
    Q_INVOKABLE int findMeterIndex(int meterId) const;

    /**
     * @brief 获取指定索引的电表数据（QML 友好）
     * @param index 索引
     * @return QVariantMap 包含所有电表数据的映射
     */
    Q_INVOKABLE QVariantMap getMeterData(int index) const;

signals:
    /**
     * @brief 数量改变信号
     */
    void countChanged();

    /**
     * @brief 过滤模式改变信号
     */
    void filterModeChanged();

    /**
     * @brief 过滤总线ID改变信号
     */
    void filterBusIdChanged();

public slots:
    /**
     * @brief 处理电表数据批量更新（优化接口，外部可连接）
     * @param meterIds 已更新的电表ID列表
     */
    void onMeterDataBatchUpdated(const QVector<int> &meterIds);

private slots:
    /**
     * @brief 处理电表数据更新（单个）
     */
    void onMeterDataUpdated();

    /**
     * @brief 处理电表上线
     */
    void onDeviceOnline(int meterId);

    /**
     * @brief 处理电表离线
     */
    void onDeviceOffline(int meterId);

    /**
     * @brief 处理设备总数改变
     */
    void onTotalCountChanged();

    /**
     * @brief 批量更新延迟处理槽函数
     */
    void processPendingUpdates();

private:
    /**
     * @brief 更新过滤后的电表列表
     */
    void updateFilteredMeters();

    /**
     * @brief 检查电表是否符合过滤条件
     */
    bool matchFilter(Meter *meter) const;

    DeviceManager *m_deviceManager;    ///< 设备管理器
    QVector<Meter *> m_filteredMeters; ///< 过滤后的电表列表
    FilterMode m_filterMode;           ///< 过滤模式
    int m_filterBusId;                 ///< 过滤总线ID

    // 批量更新优化
    QTimer *m_updateTimer;      ///< 延迟更新定时器
    QSet<int> m_pendingUpdates; ///< 待更新的电表ID集合
};

#endif // METERMODEL_H
